///****************************************
// * Copyright (c) 2015 NiuWa.
// * All rights reserved.
// * Created on 2015年4月15日
// * 
// * Contributors:
// * 	   Percy.Lo - initial implementation
// ****************************************/
//package com.niuwa.p2p.server.manggoDB.exchange;
//
//import java.net.InetAddress;
//import java.net.UnknownHostException;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import com.mongodb.BasicDBObject;
//import com.mongodb.DBObject;
//import com.niuwa.p2p.core.enums.MongoQueueEnum;
//import com.niuwa.p2p.server.manggoDB.MongoDBManager;
//import com.niuwa.p2p.server.utils.PropertiesLoader;
//
///**
// * 
// * @title ExchangeDBUtils.java
// *
// * @author Percy.Lo
// * @version 1.0
// * @created 2015年4月16日
// */
//public class ExchangeMongoDBHelper {
//	final Logger logger = LoggerFactory.getLogger(this.getClass());
//	
//	private MongoDBManager mongoDBManager;
//	private PropertiesLoader propertiesLoader = new PropertiesLoader("jdbc.properties");
//	private Map<MongoQueueEnum, String> queueNames=new HashMap<MongoQueueEnum, String>();
//	
//	//公共字段
//	public final static String ID = "_id";//主键，投资记录id|借款项目编号|债权申请编号
//	public final static String USER_ID = "user_id";//用户id，借款人或投资人在平台上的Id（使用此避免同一人的借款与投资相匹配）
//	public final static String VERSION = "version";//版本号，mysql记录的版本号
//	public final static String STATUS = "status";//mongo中该条记录的处理状态，0待处理，1处理中;
//	public final static String LAST_DATE = "lastDate";//最后更新时间
//	public final static String SCAN_BATCH = "scanBatch";//最后扫描批次
//	public final static String SCAN_HOST_NAME = "scanHostName";//最后扫描的主机
//	public final static String EORROR_MSG = "errorMsg";//task的异常信息
//	//借款|存量债权相关字段
//	public final static String lOAN_AMOUNT = "loan_amount";//借款额度|存量债权剩余金额|债权本金
//	
//	//投资资金相关字段
//	public final static String INVEST_AMOUNT = "invest_amount";//投资金额
//	public final static String INVEST_SURPLUS_AMOUNT = "invest_surplus_amount";//投资剩余金额
//	public final static String LIMIT = "limit";//单笔投资上限
//	
//	public final static String SINGLE_TRADE_AMOUT = "single_trade_amout";//单笔交易金额
//	
//	//债权转让相关字段
//	public final static String TR_PROJECT_NO = "projectNo";//债权转让的项目编号
//	public final static String TR_RECORD_NO = "recordNo";//债权转让者的投资编号
//	public final static String TR_CREDIT_NO = "creditNo";//债权转让的债权编号
//	public final static String TR_CREDIT_VERSION = "creditVersion";//债权转让的用户债权版本号
//	
//	//资金和债权转让共有部分
//	public final static String PRODUCT_CODE = "productCode";
//	public final static String PRODUCT_NAME = "productName";
//	
//	public String hostName="Unknown";
//	private ExchangeMongoDBHelper() {
//		//当前主机信息
//		try {
//			InetAddress net=InetAddress.getLocalHost();
//			hostName=net.getHostAddress()+" | "+net.getHostName();
//		} catch (UnknownHostException e) {
//			logger.error("ExchangeMongoDBHelper,获取主机信息失败！",e);
//		}
//		
//		try {
//			mongoDBManager = new MongoDBManager(propertiesLoader.getProperty("mongoDB.host"), propertiesLoader.getInteger("mongoDB.port").intValue(), propertiesLoader.getProperty("mongoDB.database.p2pbackDB"));
//		} catch (Exception e) {
//			logger.error("ExchangeMongoDBHelper,连接mongoDB失败！",e);
//		}
//		//#借款债权队列
//		queueNames.put(MongoQueueEnum.queueLoanApp, propertiesLoader.getProperty("mongoDB.table.queue_loan_app"));//项目队列，app端类项目
//		queueNames.put(MongoQueueEnum.queueLoanChannel, propertiesLoader.getProperty("mongoDB.table.queue_loan_channel"));//项目队列 ，渠道类项目
//		queueNames.put(MongoQueueEnum.queueLoanTransfer, propertiesLoader.getProperty("mongoDB.table.queue_loan_transfer"));//项目队列，投资计划 债权转让类项目
//		
//		//#资金队列
//		queueNames.put(MongoQueueEnum.queueFundA, propertiesLoader.getProperty("mongoDB.table.queue_fund_A"));//资金队列  ，资金队列A，新资金
//		queueNames.put(MongoQueueEnum.queueFundB, propertiesLoader.getProperty("mongoDB.table.queue_fund_B"));//资金队列  ，资金队列B，老资金>400
//		queueNames.put(MongoQueueEnum.queueFundC, propertiesLoader.getProperty("mongoDB.table.queue_fund_C"));//资金队列  ，资金队列C，老资金 >10 & <=400
//	}
//
//	private static class SingletonHolder {     
//	     static final ExchangeMongoDBHelper INSTANCE = new ExchangeMongoDBHelper();     
//	}     
//	      
//	/**
//	 * 获取单例   
//	 */
//	public static ExchangeMongoDBHelper getInstance(){
//		return SingletonHolder.INSTANCE; 
//	}
//	
//	/**
//	 * 新增项目或资金
//	 */
//	public void add(MongoQueueEnum queue,BasicDBObject o) throws Exception {
//		o.put(STATUS, "0");//待处理
//		o.put(LAST_DATE, new Date().toString());
//		o.put(SCAN_BATCH, String.valueOf(System.currentTimeMillis()));//初始扫描批次
//		o.put(SCAN_HOST_NAME, hostName);//初始化扫描主机
//		mongoDBManager.insert(queueNames.get(queue), o);
//	}
//	
//	/**
//	 * 新增项目或资金
//	 */
//	public void add(MongoQueueEnum queue,List<DBObject> list) throws Exception {
//		
//		for (DBObject o : list) {
//			o.put(STATUS, "0");//待处理
//			o.put(LAST_DATE, new Date().toString());
//			o.put(SCAN_BATCH, String.valueOf(System.currentTimeMillis()));//初始扫描批次
//			o.put(SCAN_HOST_NAME, hostName);//初始化扫描主机
//		}
//		if(list.size()>0)
//			mongoDBManager.insert(queueNames.get(queue), list);
//	}
//	
//	/**
//	 * 标记异常task
//	 * @param queue 目标队列
//	 * @param obj 目标对象
//	 * @param msg 异常信息
//	 * @throws Exception
//	 */
//	public void markException(MongoQueueEnum queue,DBObject obj,String msg) throws Exception{
//		deleteById(queue, obj,true);
//		obj.put(STATUS, "9");//异常的tansk
//		obj.put(LAST_DATE, new Date().toString());
//		obj.put(EORROR_MSG, msg);
//		logger.debug("    -->： markException, "+obj);
//		mongoDBManager.insert(queueNames.get(queue), obj);
//	}
//	
//	/**
//	 * 移到尾部（处理后的任务移到尾部，状态修改为待处理）
//	 * @throws Exception 
//	 */
//	public void moveToLast(MongoQueueEnum queue,DBObject obj) throws Exception{
//		deleteById(queue, obj,true);
//		obj.put(STATUS, "0");//重置为待处理
//		obj.put(LAST_DATE, new Date().toString());
//		obj.removeField(EORROR_MSG);
//		logger.debug("    -->： moveToLast, "+obj);
//		mongoDBManager.insert(queueNames.get(queue), obj);
//	}
//	
//	/**
//	 * 移到尾部（处理后的任务移到其他队列的尾部，状态修改为待处理）
//	 * @throws Exception 
//	 */
//	public void moveToOtherLast(MongoQueueEnum fromQueue,MongoQueueEnum toQueue,DBObject obj) throws Exception{
//		deleteById(fromQueue, obj,true);
//		obj.put(STATUS, "0");//重置为待处理
//		obj.put(LAST_DATE, new Date().toString());
//		obj.removeField(EORROR_MSG);
//		logger.debug("    -->： moveToOtherLast, "+obj);
//		mongoDBManager.insert(queueNames.get(toQueue), obj);
//	}
//	
//	/**
//	 * 查询队列中的第一条有效记录(读取队列中第一条待处理任务)
//	 */
//	public DBObject firstAndLock(MongoQueueEnum queue,Long currentBatchId){
//		//查询条件
//		DBObject query=new BasicDBObject(STATUS,"0");
//		if(currentBatchId!=null){//项目类队列扫描需满足批次号不为当前批次
//			query.put(SCAN_BATCH, new BasicDBObject("$ne",currentBatchId));
//		}
//		//锁定操作的属性
//		DBObject o=new BasicDBObject(STATUS,"1");//处理中
//		o.put(LAST_DATE, new Date().toString());
//		DBObject rs=mongoDBManager.findAndModify(queueNames.get(queue), query,o);
//		//结果集部分属性更新
//		if(rs!=null){
//			rs.put(SCAN_BATCH, currentBatchId);//更新扫描批次
//			rs.put(SCAN_HOST_NAME, hostName);//更新化扫描主机
//		}
//		return rs;
//	}
//	
//	/**
//	 * 释放锁定(外部回滚场景时使用)
//	 * @param isOuter 失败情况下内部做二次解锁尝试的标识，外部调用一律传true 
//	 */
//	public void unLock(MongoQueueEnum queue,DBObject lockObj,boolean isOuter){
//		String id=(String)lockObj.get(ID);
//		try {
//			BasicDBObject o=new BasicDBObject(STATUS,"0");//待处理
//			o.append(LAST_DATE, new Date().toString());
//			mongoDBManager.findAndModify(queueNames.get(queue), new BasicDBObject(ID,id),o);
//		} catch (Exception e) {
//			if(isOuter){
//				unLock(queue, lockObj, false);//再次尝试
//			}else {
//				logger.error("ExchangeDBUtils.unLock ->"+queue+","+id,e);
//			}
//		}
//	}
//	
//	/**
//	 * 根据id删除记录
//	 * @param isOuter 失败情况下内部做二次删除尝试的标识，外部调用一律传true
//	 */
//	public void deleteById(MongoQueueEnum queue,DBObject o,boolean isOuter){
//		String id=(String)o.get(ID);
//		deleteById(queue, id, isOuter);
//	}
//	
//	/**
//	 * 根据id删除记录
//	 * @param isOuter 失败情况下内部做二次删除尝试的标识，外部调用一律传true
//	 */
//	public void deleteById(MongoQueueEnum queue,String id,boolean isOuter){
//		try {
//			mongoDBManager.delete(queueNames.get(queue), new BasicDBObject(ID,id));
//		} catch (Exception e) {
//			if(isOuter){
//				deleteById(queue, id, false);//再次尝试
//			}else {
//				logger.error("ExchangeDBUtils.deleteById ->"+queue+","+id,e);
//			}
//		}
//	}
//}
